package com.bw.zzy.partal2.controller;


import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.json.JSONUtil;
import com.bw.zzy.partal2.common.CommonResult;
import com.bw.zzy.partal2.controller.form.LoginForm;
import com.bw.zzy.partal2.service.UserService;
import io.micrometer.core.instrument.step.StepTuple2;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Set;

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "http://localhost:4000", allowCredentials = "true")   //前端访问后端会有跨域  解决跨域问题
@Tag(name = "UserController", description = "用户管理接口")
public class UserController {
    @Autowired
    UserService userService;

    @PostMapping("/login")
    @Operation(summary = "用户登录")
    public CommonResult userLogin(@Valid @RequestBody LoginForm loginForm) {  // 将请求参数封装到 LoginForm 对象中去
        HashMap hashMap = JSONUtil.parse(loginForm).toBean(HashMap.class);   //将参数转换成haspmap   因为dao层是hashmap
        Integer user_id = userService.userLogin(hashMap);   //查询的是id
        CommonResult result = CommonResult.ok().put("result", (user_id != null) ? "登录成功" : "登录失败");
        if (user_id != null) {
            /*
             *   Sa-Token框架要求我们用户登陆成功之后，必须在Web方法中执行StpUtil.setLoginId(userId) 生成Token信息
             *   会被保存到redis数据库
             * */
            StpUtil.login(user_id);   //权限管理框架    自动生成name和value
            //获取tokenValue和Name，会被保存到redis数据库
            System.out.println(StpUtil.getTokenValue());
            System.out.println(StpUtil.getTokenName());

            //查询用户对应的权限信息
            Set<String> privileges = userService.selectUserPrivileges(user_id);
            //将用户权限和token写回到客户端
            result.put("permissions", privileges);

            result.put("token", StpUtil.getTokenValue());
            
        }

        return result;
    }

    @GetMapping("/logout")
    @SaCheckLogin    //特殊注解，只有是登录状态才能访问logout方法，不然不能退出
    @Operation(summary="退出登录")
    public CommonResult logout() {
        StpUtil.logout();
        return CommonResult.ok();
    }
}

